package com.tmsps.ne4weixin.api;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import com.alibaba.fastjson2.JSONObject;
import com.tmsps.ne4weixin.bean.BaseResultBean;
import com.tmsps.ne4weixin.bean.OAuthToken;
import com.tmsps.ne4weixin.bean.UserInfo;
import com.tmsps.ne4weixin.config.WxConfig;
import com.tmsps.ne4weixin.utils.WXHttpUtil;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * @Title: OAuthAPI.java
 * @Package: com.tmsps.ne4weixin.api
 * @Description: 网页授权管理API
 */
@Slf4j
public class OAuthAPI extends BaseAPI {

	public OAuthAPI(WxConfig wxConfig) {
		super(wxConfig);
	}
	
	/**
	 * 拉取用户信息
	 * @param token		网页授权接口调用凭证
	 * @param openId	用户的唯一标识
	 */
	public UserInfo getUserInfo(String token, String openId) {
		String url = String.format(GET_USER_INFO, token, openId, "zh_CN");
		String result = WXHttpUtil.get(url);
		return JSONObject.parseObject(result, UserInfo.class);
	}
	
	/**
	 * 拉取用户信息
	 * @param token		网页授权接口调用凭证
	 */
	public UserInfo getUserInfo(OAuthToken token){
		String url = String.format(GET_USER_INFO, token.getAccess_token(), token.getOpenid(), "zh_CN");
		String result = WXHttpUtil.get(url);
		return JSONObject.parseObject(result, UserInfo.class);
	}
	
	/**
	 * 获取引导用户进入授权页面url
	 * @param redirectUrl	授权后重定向的回调链接地址
	 * @param scope			应用授权作用域
	 * @param state			重定向后会带上state参数
	 * @return
	 */
	public String getOAuthUrl(String redirectUrl, String scope, String state) {
		state = StrUtil.isEmptyIfStr(state) ? "STATE" : state;
		//重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节
		String regex = "^[a-z0-9A-Z]+$";
		if (!state.matches(regex) || state.getBytes().length > 128) {
			log.error("重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节");
			return null;
		}

		try {
			return String.format(GET_CODE, wxConfig.getAppid(), URLEncoder.encode(redirectUrl, "UTF-8"), scope, state);
		} catch (UnsupportedEncodingException e) {
			log.error("授权页面url操作异常", e);
		}
		return null;
	}
	
	/**
	 * 通过code换取网页授权access_token
	 * @param code
	 * @return
	 */
	public OAuthToken getAccessToken(String code) {
		String url = String.format(GET_ACCESS_TOKEN,wxConfig.getAppid(),wxConfig.getSecret(), code);
		String result = WXHttpUtil.get(url);
		return JSONObject.parseObject(result, OAuthToken.class);
	}
	
	/**
	 * 刷新access_token
	 * @param token		网页授权接口调用凭证
	 * @return
	 */
	public OAuthToken refreshOAuthToken(OAuthToken token) {
		String url = String.format(REFRESH_ACCESS_TOKEN, wxConfig.getAppid(), token.getRefresh_token());
		token.getRefresh_token();
		String result = WXHttpUtil.get(url);
		return JSONObject.parseObject(result, OAuthToken.class);
	}
	
	/**
	 * 检验授权凭证（access_token）是否有效
	 * @param token		网页授权接口调用凭证
	 * @return
	 */
	public BaseResultBean checkOAuthToken(OAuthToken token) {
		String url = String.format(CHECK_ACCESS_TOKEN, token.getAccess_token(), token.getOpenid());
		String result = WXHttpUtil.get(url);
		return JSONObject.parseObject(result, BaseResultBean.class);
	}
}
